综合实验:基于 PN 结的数字温度传感器保姆级教程
导言:万物皆有“热”情
欢迎来到这个有趣的电子设计实验!我们的目标是亲手打造一个数字温度计。这个温度计的核心,并非某些高科技、昂贵的传感器,而是我们电子世界中最基础的元件——晶体管或二极管。我们将利用它们内部 PN 结的一个微妙特性:它的电学行为会随着温度发生可预测的变化。
通过本实验,您将不仅仅是搭建一个电路,更是将理论物理(半导体特性)与模拟电子(信号放大)、数字电子(信号转换)以及嵌入式编程(数据显示)融为一体,体验一次完整的“从想法到产品”的工程实践。
第一部分:核心原理 - 让温度“说话”
我们如何让一个小小的晶体管感知温度?答案在于它的 (基极-发射极电压)。
对于一个双极晶体管(BJT),其集电极电流 和基极-发射极电压 之间的关系大致遵循以下公式:
其中:
- 是反向饱和电流,它本身对温度非常敏感。
- 是基本电荷 ( 库仑)。
- 是玻尔兹曼常数 ( J/K)。
- 是绝对温度(开尔文, K)。
如果我们对这个公式进行变换,可以得到 。这个公式看起来很复杂,特别是 也会随温度变化。
天才的解决方案: 为了消除恼人的 项,我们可以用两个完全相同(理想情况下)的晶体管,并让它们工作在两个不同的集电极电流下,比如 和 。
- 对于晶体管1:
- 对于晶体管2:
现在,我们将这两个电压相减,奇迹发生了:
核心思想:PTAT 电压 这个电压差 (Proportional To Absolute Temperature,与绝对温度成正比)只与绝对温度 和物理常数()以及电流比(本例中为10)有关。它是一个干净、线性、只随温度变化的电压信号!
根据这个公式,我们可以计算出该电压信号的灵敏度:
这意味着,温度每变化 1 摄氏度(或 1 开尔文), 电压会变化约 0.198 毫伏。这个信号非常微弱,但非常有价值!
我们的任务就是:产生它 -> 放大它 -> 数字化它 -> 显示它。
第二部分:分步实践 - 从元件到成品
我们将按照实验要求中的任务分解,一步步进行。
步骤 A: 筛选元件,搭建 PTAT 电压发生器 (20-25分)
1. 元件筛选:
- 核心元件: 一对性能一致的 NPN 晶体管,例如
2N3904或BC547。或者两个相同的开关二极管,如1N4148。 - 为何要“一致”? 我们的核心公式是基于两个晶体管的 相互抵消的假设。如果两个管子差异太大,这个假设就不成立,会引入误差。
- 如何筛选?
- 简单方法: 购买同一批次的晶体管,误差通常较小。
- 进阶方法: 使用万用表的hFE(三极管放大倍数)档位,挑选两个hFE值非常接近的晶体管。或者搭建一个简单电路,在相同偏置下测量并记录它们的 ,选择 最接近的一对。
2. 电路搭建: 我们需要一个电路来产生 和 这两个电流。一个简单的电流镜是实现此目的的绝佳选择。
电路图示例 (使用BJT):
- 在这个电路中,晶体管
Q1和Q2构成一个电流镜,用于为我们的传感核心Q3和Q4提供电流。 - 电阻
R2的值是R1的十分之一,可以近似产生 和 的关系。这是一种简化的做法,更精确的设计会使用更复杂的电流源。 Q3和Q4是我们精心筛选的那对匹配晶体管。输出电压 就是Q3和Q4基极之间的电压差。
- 在这个电路中,晶体管
3. 测量验证:
- 搭建好电路后,给它通上电(例如 )。
- 用万用表(设置为直流毫伏档)精确测量
Q3和Q4的基极-发射极电压 和 。 - 计算 。
- 理论计算: 假设室温为 25°C (298.15 K),理论上的 应该是:
- 如果你的测量值在 50-70mV 之间,那么恭喜你,传感器的“心脏”已经成功跳动了!
步骤 B: 仿真与放大 (50-60分)
信号太微弱(~198µV/°C),单片机的ADC无法直接分辨。我们需要将它放大。
1. 电路仿真 (强烈推荐):
- 工具: 使用
Multisim、LTspice(免费) 或其他仿真软件。 - 目的: 在烧毁任何元件之前,验证你的放大电路设计是否正确,增益是否合适。
- 在软件中搭建你的PTAT电路和下面的放大电路,进行
DC Sweep(直流扫描)分析,观察输出电压是否随温度线性变化。
2. 放大器设计 - 差分放大电路: 我们需要放大的是两个电压的差值,所以必须使用差分放大电路。
选择运放 (Op-Amp):
- 低输入失调电压 (): 我们的输入信号本身只有几十毫伏,如果运放自身的失调电压就有几毫伏,会带来巨大误差。因此,选择 精密运放 是关键。例如
OP07、AD620(仪表放大器,效果更好) 或一些现代的低失调CMOS运放。避免使用LM741或LM358,除非你对误差不敏感。 - 低输入偏置电流 (): 确保运放不会从我们的PTAT电路中“偷走”太多电流,影响其工作。
- 轨到轨 (Rail-to-Rail) 输出: 如果你使用单电源(如5V)供电,轨到轨运放能让输出电压范围更接近0V和5V,提高动态范围。
- 低输入失调电压 (): 我们的输入信号本身只有几十毫伏,如果运放自身的失调电压就有几毫伏,会带来巨大误差。因此,选择 精密运放 是关键。例如
电路图示例 (使用单运放):
- 增益计算: 这个电路的增益 。
- 目标增益设置: 假设我们的温度范围是 20°C (293.15 K) 到 100°C (373.15 K)。
- @ 20°C ≈ 58.5 mV
- @ 100°C ≈ 74.5 mV
- 电压变化范围 。
- 假设我们使用 Arduino,其ADC输入范围是 0-5V。我们希望将这 80°C 的变化映射到比如 2V 的电压变化上。那么增益 。
- 我们可以选择 ,。(实际中请选择标准的电阻值,如 )。
注意: 为了获得精确增益,请使用高精度(1%或更高)的电阻。
步骤 C & D: AD转换与校准 (70-85分)
现在我们有了一个随温度线性变化的、幅度足够的电压信号,是时候让单片机来读取它了。
1. AD转换:
- 连接: 将差分放大器的输出引脚连接到单片机的一个模拟输入引脚(例如Arduino的
A0)。同时,确保单片机和你的模拟电路共地(GND相连)。 - ADC基础知识:
分辨率: Arduino UNO的ADC是10位的,意味着它可以将输入电压分成 个级别(0-1023)。参考电压 (V_ref): 这是ADC测量的上限。Arduino上通常是5V或3.3V。- 转换公式:
输入电压 = (ADC读数 / 1023.0) * V_ref
2. 编程实现: 以下是一个简单的Arduino伪代码/示例:
const float V_REF = 5.0; // ADC的参考电压
void setup() {
Serial.begin(9600);
}
void loop() {
// 1. 读取ADC值
int adcValue = analogRead(A0);
// 2. 转换为电压
float voltage = (adcValue / 1023.0) * V_REF;
// 3. 将电压转换为温度 (!!! 重点: 使用校准后的公式 !!!)
// 假设我们通过校准得到 y = mx + c 的关系
// Temperature = (voltage - c) / m;
float temperature = convertVoltageToTemp(voltage);
// 4. 显示结果
Serial.print("ADC: ");
Serial.print(adcValue);
Serial.print(", Voltage: ");
Serial.print(voltage);
Serial.print(" V, Temperature: ");
Serial.print(temperature);
Serial.println(" C");
delay(1000);
}
float convertVoltageToTemp(float volt) {
// 在这里填入你校准后得到的公式
// 例如: return (volt - 0.5) / 0.1;
// 这个公式需要通过下面的校准步骤来确定
float temp;
// ... 计算逻辑 ...
return temp;
}```
**3. 校准 (最关键的一步!):**
理论计算很美好,但元件的公差、运放的失调等会引入误差。**必须进行校准!**
> **校准是理论与现实之间的桥梁。** 我们的目标是找到一个精确的数学关系式 $Temperature = m \cdot V_{out} + c$,将我们测量的最终电压 $V_{out}$ 映射到真实温度。
* **你需要:** 一个商用的、你信得过的数字温度计。
* **两点校准法:**
1. **取低点:** 将你的传感器和商用温度计一起放入一个温度相对稳定的环境中(例如,一杯冰水混合物,理论为0°C,或室温环境)。等待读数稳定。记录下商用温度计的读数 $T_1$ 和你的电路输出电压 $V_1$。
2. **取高点:** 将两个传感器一起放入一个较热的环境(例如,用密封袋包好后放入一杯热水中)。等待读数稳定。记录下商用温度计的读数 $T_2$ 和你的电路输出电压 $V_2$。
3. **计算斜率 `m` 和截距 `c`:**
* 斜率 $m = \frac{T_2 - T_1}{V_2 - V_1}$
* 截距 $c = T_1 - m \cdot V_1$
4. **最终公式:** 你现在得到了专属于你的温度计的转换公式:$Temperature = m \times Voltage + c$。将这个 `m` 和 `c` 的值填入你的代码中。
#### 步骤 E & F: 产品化 (85-99分)
**1. 洞洞板/PCB实现:**
* 将你在面包板上验证好的电路,焊接到洞洞板或自己设计的PCB上。
* **布局建议:**
* 模拟部分(PTAT和放大电路)和数字部分(单片机)分区布局。
* 电源线和地线要尽量粗、短。
* 在运放的电源引脚旁放置一个 `0.1µF` 的去耦电容,以滤除高频噪声。
**2. 独立供电与功耗:**
* **电源:** 可以使用9V电池,通过一个LDO(低压差线性稳压器)如 `LM7805` (转为5V) 或 `AMS1117-3.3` (转为3.3V) 为系统供电。
* **功耗优化 (进阶):**
* 选择低功耗的运放和单片机。
* 在代码中,可以让单片机在两次测量之间进入睡眠模式(`sleep mode`),以大幅降低功耗,延长电池寿命。
* 考虑使用开关电源(`Buck/Boost` 芯片)代替LDO,因为它们的转换效率更高。
**3. 添加显示:**
* 将计算出的温度值显示在一个 `LCD1602` 屏幕或 `OLED` 屏幕上,让它成为一个真正独立的数字温度计!
---
### 总结与要点回顾
1. **核心原理:** 利用两个工作在不同电流下的相同PN结,产生一个与绝对温度成线性关系的电压信号 $V_{PTAT}$。
2. **信号处理:** $V_{PTAT}$ 信号非常微弱,必须使用**低失调**的精密运放搭建**差分放大电路**进行放大。
3. **数字化:** 利用单片机的ADC将模拟电压转换为数字值。
4. **校准是王道:** 由于元件非理想性,必须通过与标准温度计进行至少两点校准,才能获得精确的温度读数。
5. **工程化:** 考虑电源、功耗、布局和显示,将一个电路原型变成一个可靠的独立设备。
祝你实验顺利,享受创造的乐趣!
<NolebaseGitContributors />
<NolebaseGitChangelog />